/**
 * 
 */
package com.xb.cloud.common.mongo.client;

import java.util.List;
import java.util.Map;

import org.mongodb.morphia.Key;
import org.mongodb.morphia.query.Query;

import com.mongodb.WriteConcern;
import com.mongodb.WriteResult;

/**
 * 操作mongodb的客户端接口
 */
public interface SimpleMongoClient {

	/**
	 * 保存对象
	 * 如果id不存在则新增
	 * 如果id存在则以entity覆盖Mongodb的对应记录
	 * @param entity
	 * @param wc 写策略，默认为WriteConcern.SAFT,
	 * @return
	 */
	public <T> Key<T> save(T entity, WriteConcern wc);
	
	public <T> Key<T> save(T entity);

	/**
	 * 更新对象
	 * 如果id存在则合并entity与Mongodb的对应记录后保存
	 * 如果id不存在抛出com.google.code.morphia.query.UpdateException(RuntimeException)
	 * @param entity
	 * @return
	 */
	public <T> Key<T> merge(T entity, WriteConcern wc);
	
	public <T> Key<T> merge(T entity);
	
	/**
	 * 删除指定的对象
	 * @param entity
	 * @return
	 */
	public <T> WriteResult delete(T entity, WriteConcern wc);
	
	public <T> WriteResult delete(T entity);
	
	/**
	 * 根据指定类型和Id删除一条记录
	 * @param entityClass
	 * @param id
	 * @return
	 */
	public <T, V> WriteResult deleteById(Class<T> entityClass, V id, WriteConcern wc);
	
	public <T, V> WriteResult deleteById(Class<T> entityClass, V id);
	
	/**
	 * 根据查询条件删除记录
	 * @param query
	 * @return
	 */
	public <T> WriteResult deleteByCriteria(Query<T> query, WriteConcern wc);
	
	public <T> WriteResult deleteByCriteria(Query<T> query);
	
	/**
	 * 根据指定类型和Id找到一条记录
	 * @param entityClass
	 * @param id
	 * @return
	 */
	public <T, V> T findById(Class<T> entityClass, V id);
	
	
	public <T, V> T findByIdForPrimary(Class<T> entityClass, V id);
	
	/**
	 * 根据指定的类型和过滤条件查找记录
	 * @param entityClass
	 * @param filters
	 * @return
	 */
	public <T> List<T> find(Class<T> entityClass, Map<String, Object> filters, boolean slaveOk);

	public <T> List<T> find(Class<T> entityClass, Map<String, Object> filters);
	
	/**
	 * 根据指定的类型和过滤条件查找记录，并设置对象需要查询的字段
	 * @param entityClass
	 * @param filters
	 * @param retrievedFields
	 * @return
	 */
	public <T> List<T> find(Class<T> entityClass, Map<String, Object> filters, Map<String, Boolean> retrievedFields, boolean slaveOk);
	
	public <T> List<T> find(Class<T> entityClass, Map<String, Object> filters, Map<String, Boolean> retrievedFields);

	/**
	 * 根据指定的类型和过滤条件查找记录，并设置对象需要查询的字段，按指定的排序属性进行排序
	 * @param entityClass
	 * @param filters
	 * @param retrievedFields
	 * @param sort
	 * @return
	 */
	public <T> List<T> find(Class<T> entityClass, Map<String, Object> filters, Map<String, Boolean> retrievedFields, String sort, boolean slaveOk);
	
	public <T> List<T> find(Class<T> entityClass, Map<String, Object> filters, Map<String, Boolean> retrievedFields, String sort);

	/**
	 * 根据实例查找记录
	 * @param ex
	 * @return
	 */
	public <T> List<T> findByExample(T ex);
	
	/**
	 * 分页查询，根据指定的类型和过滤条件查找记录，并设置对象需要查询的字段，按指定的排序属性进行排序
	 * 泛型方法 T: document
	 * @param entityClass 实体类 
	 * @param filters 查询条件， operator: = $eq !=, <> $ne >, <, >=,<= $gt, $lt, $gte, $lte in $in nin $nin elem $elemMatch exists $exists all $all size $size
	 * @param retrievedFields 需要查询的字段
	 * @param sort 排序
	 * @param offset 跳过记录数
	 * @param limit 记录数
	 * @return
	 */
	public <T> List<T> find(Class<T> entityClass, Map<String, Object> filters, Map<String, Boolean> retrievedFields, String sort, Integer offset, Integer limit, boolean slaveOk);
	
	public <T> List<T> find(Class<T> entityClass, Map<String, Object> filters, Map<String, Boolean> retrievedFields, String sort, Integer offset, Integer limit);

	/**
	 * 根据类型获取一个查询条件
	 * @param entityClass
	 * @return
	 */
	public <T> Query<T> getQuery(Class<T> entityClass);
	
	/**
	 * 根据查询条件查询记录
	 * @param query
	 * @return
	 */
	public <T> List<T> queryByCriteria(Query<T> query);
	
	/**
	 * 根据类型和json字符串转换为实体对象
	 * @param entityClass
	 * @param json
	 * @return
	 */
	public <T> T jsonToEntity(Class<T> entityClass, String json);

	/**
	 * 将对象转换为json字符串
	 * @param entity
	 * @return
	 */
	public <T> String entityToJson(T entity);



}
